package com.cx.mall.demo.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 * 横切关注点
 */
@Component
@Aspect
public class Assistant {
    /**
     * 抽取切点表达式
     */
    @Pointcut(value = "execution(* com.cx.mall.demo.service.impl.UserServiceImpl.*(..))")
    public void myPointcut(){}
    @Pointcut(value = "execution(* com.cx.mall.demo.service.impl.UserServiceImpl.find(..))")
    public void findPointcut(){}

    @Pointcut(value = "execution(* com.cx.mall.demo.service.impl.UserServiceImpl.delete(..))")
    public void deletePointcut(){}

    /**
     * 前置通知
     */
    @Before(value = "myPointcut()")
    public void authentication(){
        System.out.println("身份审核通过");
    }

    /**
     * 后置通知
     * @param jp 连接点参数
     */
//    @After(value = "!findPointcut()")
    @AfterReturning(value = "myPointcut()")
    public void doLog(JoinPoint jp){
        // 获取目标方法
        String type = jp.getSignature().getName();
        System.out.println("记录" + type + "日志");
    }

    /**
     * 返回成功通知
     * @param jp 连接点参数
     * @param result 返回值回调结果
     */
    @AfterReturning(value = "myPointcut()",returning = "result")
//    @AfterReturning(value = "!findPointcut() || deletePointcut()",returning = "result")
    public static void success(JoinPoint jp,boolean result){
        // 获取方法参数
        Object[] args = jp.getArgs();
        // 获取目标方法
        String type = jp.getSignature().getName();
        if(result){
            System.out.println(type + Arrays.toString(args) + "成功" );
        }else {
            System.out.println(type + Arrays.toString(args) + "失败" );
        }
    }

    /**
     * 异常通知
     * @param jp 连接点参数
     * @param e 异常回调
     */
    @AfterThrowing(value = "myPointcut()",throwing = "e")
//    @AfterThrowing(value = "deletePointcut()",throwing = "e")
    public static void exception(JoinPoint jp,Throwable e){
        // 获取方法参数
        Object[] args = jp.getArgs();
        // 获取目标方法
        String type = jp.getSignature().getName();
        System.out.println("参数:" + Arrays.toString(args));
        System.out.println("异常:" + e.getMessage());
    }
//    /**
//     * 环绕通知
//     * @param jp 连接点参数
//     */
//    @Around(value = "myPointcut()")
//    public static void around(ProceedingJoinPoint jp){
//        // 获取方法参数
//        Object[] args = jp.getArgs();
//        // 获取目标方法
//        String type = jp.getSignature().getName();
//        try{
//            System.out.println("身份审核通过");
//            Object result = jp.proceed();//调用目标方法
//            if((Boolean) result){
//                System.out.println(type + Arrays.toString(args) + "成功" );
//            }else {
//                System.out.println(type + Arrays.toString(args) + "失败" );
//            }
//        }catch (Throwable e){
//            System.out.println("参数:" + Arrays.toString(args));
//            System.out.println("异常:" + e.getMessage());
//        }finally {
//            System.out.println("记录" + type + "日志");
//        }
//    }

//    /**
//     * 异常通知
//     */
//    @AfterThrowing(value = "myPointcut()", throwing = "e")
//    public void exception(JoinPoint jp,Exception e){
//        String type = jp.getSignature().getName();
//        System.out.println(type + "异常处理" + e.getMessage());
//    }
}
